/**
 * 持久化封装,使用react-native-storage
 * 
 * @author CT
 * @email 994599447@qq.com
 * @date 2017.8.14
 */

'use strict';
import Storage from 'react-native-storage';
import { AsyncStorage } from 'react-native';
import SYNC from './storageSync';

const defaultExpires = null;

/**
 * 初始化Storage配置，需要在程序启动时调用该函数进行初始化
 * 初始化完毕后，可以选择直接使用本类中提供的操作函数，或者无需import本类直接在js中调用global.storage.方法()，global.storage未经封装，具体使用方法查看：
 * https://github.com/sunnylqm/react-native-storag
 */
export const initStorage = () => {
  if(!global.storage){
    let storage = new Storage({
      // 最大容量，默认值1000条数据循环存储
      size: 1000,
      // 存储引擎：对于RN使用AsyncStorage，对于web使用window.localStorage
      // 如果不指定则数据只会保存在内存中，重启后即丢失
      storageBackend: AsyncStorage,
      // 数据过期时间，默认一整天（1000 * 3600 * 24 毫秒），设为null则永不过期
      defaultExpires: defaultExpires,
      // 读写时在内存中缓存数据。默认启用。
      enableCache: true,
      //如果storage中没有相应数据，或数据已过期，则会调用相应的sync方法，无缝返回最新数据。
      sync: SYNC
    });

    // 将storage存入全局变量global
    global.storage = storage;
  }
}

/**
 * 保存
 * @param {string} key 
 * @param {object} object 可以是对象或基本类型
 * @param {long} expires 有效时期，单位:毫秒，不传填则永久保存
 */
export const save = (key,object,expires) => {
  if(!expires) expires = null;
  global.storage.save({
    key: key,  // 注意:请不要在key中使用_下划线符号!
    data: object,
    expires: expires
  });
}

/**
 * 保存
 * @param {string} key 
 * @param {string} id 
 * @param {object} object  可以是对象或基本类型
 * @param {long} expires  有效时期，单位:毫秒，不填则永久保存
 */
export const saveForKeyId = (key,id,object,expires) => {
  if(!expires) expires = null;
  global.storage.save({
    key: key,  // 注意:请不要在key中使用_下划线符号!
    id: id,   // 注意:请不要在id中使用_下划线符号!
    data: object,
    expires: expires
  });
}

/**
 * 读取
 * @param {string} key 
 * @return 
 */
export const load = (key) => {
  return global.storage.load({
    key: key,
  }).then(ret => {
    return ret;
  }).catch(err => {
    return err.name;
  });
}

/**
 * 读取
 * @param {string} key 
 * @param {string} id 
 */
export const loadForKeyId = (key,id) => {
  return global.storage.load({
    key: key,
    id: id,
  }).then(ret => {
    return ret;
  }).catch(err => {
    return err.name;
  });
}

/**
 * 获取某个key下的所有id
 * @param {string} key 
 */
export const getIds = (key) => {
  return global.storage.getIdsForKey(key)
  .then(ids => {
    return ids;
  }).catch(err => {
    return err.name;
  });
}

/**
 * 获取某个key下的所有数据
 * @param {string} key 
 */
export const getAllData = (key) => {
  return global.storage.getAllDataForKey(key)
  .then(data => {
    return data;
  }).catch(err => {
    return err.name;
  });
}

/**
 * 删除
 * @param {string} key 
 */
export const remove = (key) => {
  global.storage.remove({
    key: key
  });
}

/**
 * 删除
 * @param {string} key 
 * @param {string} id 
 */
export const removeForKeyId = (key,id) => {
  global.storage.remove({
    key: key,
    id: id
  });
}

/**
 * 清空map，移除所有"key-id"数据（但会保留只有key的数据）
 */
export const clearMap = () => {
  global.storage.clearMap();
}

/**
 * 清除某个key下的所有数据
 * @param {string} key 
 */
export const clearMapForKey = (key) => {
  global.storage.clearMapForKey(key);
}

